<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /* 
            typeof 数据或者变量
            typeof() 
            结果是个字符串   
            typeof typeof 结果一定是 'string'
            //只能准确的判断基本数据类型  string number boolean undefined 
        
        
            instanceof 
            数据结构 instanceof 构造函数 
            结果:布尔类型 
            // 基本数据类型不能使用 
            缺点: undefined 和null检测不出来 



            对象.hasOwnProperty(属性)
            结果是布尔类型 
            判断 对象中是否 这个属性 



            constructor
            用法: 数据结构.constructor
            返回值:  数据结构所属的构造函数  
            缺点 undefined 和 null 也出不来  


            Object.prototype.toString.call

            语法:  Object.prototype.toString.call(数据结构)

            返回值: '[object 数据类型]'
            可以准确判断所有的数据类型  


        */


        // console.log(typeof 123);
        // console.log(typeof '123');
        // console.log(typeof true);
        // console.log(typeof null);
        // console.log(typeof undefined);
        // console.log(typeof {});
        // console.log(typeof []);

        // console.log('123' instanceof String);
        // console.log(123 instanceof Number);
        // console.log(true instanceof Boolean);
        // 上面都是false  
        // console.log([] instanceof Array); // true
        // function Person(){

        // }

        // var p = new Person();
        // console.log(p instanceof Person);// true
        // console.log(null instanceof Object);// false
        // console.log(undefined instanceof Object); // false





        // function People(name, age, sex) {
        //     this.name = name;
        //     this.age = age;
        //     this.sex = sex;
        // }
        // People.prototype.sayHello = function () {
        //     console.log("hello")
        // }
        // var p = new People("小明", 12, "男");
        // console.log(p.hasOwnProperty("name")); // true  name是p自身的属性
        // console.log(p.hasOwnProperty("sayHello")); // false  sayHello不是p自身的属性



            // constructor
        //  function People(name, age, sex) {
        //     this.name = name;
        //     this.age = age;
        //     this.sex = sex;
        // }

        // const p = new People('张三',18,'男');

        // console.log(p.constructor); // 结果是构造函数  

        // console.log(p.constructor === People);
        // console.log([].constructor === Array);
        // console.log({}.constructor === Object);
        // console.log((function(){}).constructor === Function);
        // console.log(/^$/.constructor === RegExp);




        console.log(Object.prototype.toString.call({}));
        console.log(Object.prototype.toString.call([]));
        console.log(Object.prototype.toString.call(123));
        console.log(Object.prototype.toString.call('hello'));
        console.log(Object.prototype.toString.call(true));
        console.log(Object.prototype.toString.call(undefined));
        console.log(Object.prototype.toString.call(null));
        console.log(Object.prototype.toString.call(new Date()));
        console.log(Object.prototype.toString.call(/abc/));
        console.log(Object.prototype.toString.call(function(){}));

        console.log(Object.prototype.toString.call(function(){}) === '[object Function]');






    </script>
</body>

</html>